package com.lifeverse.repository;

import com.lifeverse.entity.Decision;
import com.lifeverse.entity.DecisionHistory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 决策历史数据访问接口
 */
@Repository
public interface DecisionHistoryRepository extends JpaRepository<DecisionHistory, Long> {
    
    /**
     * 根据决策查找历史记录
     */
    List<DecisionHistory> findByDecision(Decision decision);
    
    /**
     * 根据决策查找历史记录（分页）
     */
    Page<DecisionHistory> findByDecision(Decision decision, Pageable pageable);
    
    /**
     * 根据决策和操作类型查找历史记录
     */
    List<DecisionHistory> findByDecisionAndActionType(Decision decision, String actionType);
    
    /**
     * 根据操作类型查找历史记录
     */
    List<DecisionHistory> findByActionType(String actionType);
    
    /**
     * 根据操作者查找历史记录
     */
    List<DecisionHistory> findByActor(String actor);
    
    /**
     * 根据时间范围查找历史记录
     */
    List<DecisionHistory> findByTimestampBetween(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据决策按时间倒序查找历史记录
     */
    List<DecisionHistory> findByDecisionOrderByTimestampDesc(Decision decision);
    
    /**
     * 查找最近的历史记录
     */
    @Query("SELECT dh FROM DecisionHistory dh WHERE dh.decision = :decision ORDER BY dh.timestamp DESC")
    List<DecisionHistory> findRecentHistories(@Param("decision") Decision decision, Pageable pageable);
    
    /**
     * 统计决策的历史记录数量
     */
    long countByDecision(Decision decision);
    
    /**
     * 统计特定操作类型的历史记录数量
     */
    long countByActionType(String actionType);
    
    /**
     * 统计特定操作者的历史记录数量
     */
    long countByActor(String actor);
    
    /**
     * 查找决策的第一条历史记录
     */
    @Query("SELECT dh FROM DecisionHistory dh WHERE dh.decision = :decision ORDER BY dh.timestamp ASC")
    List<DecisionHistory> findFirstHistory(@Param("decision") Decision decision, Pageable pageable);
    
    /**
     * 查找决策的最后一条历史记录
     */
    @Query("SELECT dh FROM DecisionHistory dh WHERE dh.decision = :decision ORDER BY dh.timestamp DESC")
    List<DecisionHistory> findLastHistory(@Param("decision") Decision decision, Pageable pageable);
    
    /**
     * 根据结果查找历史记录
     */
    List<DecisionHistory> findByResult(String result);
    
    /**
     * 查找包含特定关键词的历史记录
     */
    @Query("SELECT dh FROM DecisionHistory dh WHERE dh.actionDescription LIKE %:keyword% OR dh.details LIKE %:keyword%")
    List<DecisionHistory> findByKeyword(@Param("keyword") String keyword);
}